--封装

object={}
object.id=1


function object:Test()
print(self.id)
end

function object:new()
-- ：冒号，会把对象作为第一个参数传进来，使用self
	local  obj = {}
self.__index=self
	setmetatable(obj,self)
	return obj
end


local myObj=object:new()--实例化

print(myObj.id)
myObj:Test()--myobject没有这个test属性，执行父类的

myObj.id=2--子类表添加了一个属性
print(object.id)--父类不变
print(myObj.id)--子类有属性

myObj:Test()--myobject没有这个test方法，所以执行父类的test方法  ，但是使用的self是自己的id

print("************封装*********")
print("-------------------------")
print("************继承*********")
--继承

function object:subClass(childChildName)
_G[childChildName]={}--初始化一个子表，添加到G表，全局可用
--建立继承关系

local child=_G[childChildName]
--子类的父类是base
child.base=self
self.__index=self
setmetatable(child,self)--设置原表

end

object:subClass("myChild1")
print(myChild1.id)--找到父类的id

child1=myChild1:new()
print(child1.id)--找到父类的父类的id

print("************继承*********")
print("-------------------------")
print("************多态*********")

object:subClass("GameObject")


GameObject.pox=0
function GameObject:move()
	self.pox=self.pox+1--这里会在子类里面生成新的属性（等号左边），等号右边的是父类的属性
	print("移动",self.pox)
end

GameObject:subClass("Player")



local p1=Player:new()
p1:move()

function Player:move()--重写
-- self.base:move()--调用父类的方法

self.base.move(self)--调用父类的方法,但是使用自己作为对象
	self.pox=self.pox+1
	print("重写移动",self.pox)
end
p1:move()

--和p1使用的都是父亲的变量
local p2=Player:new()
p2:move()